package pe.com.bbva.configuracion.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.bbva.configuracion.dao.ConfiguracionDAO;
import pe.com.bbva.configuracion.domain.Configuracion;
import pe.com.stefanini.core.dao.GenericDAOImpl;
import pe.com.stefanini.core.exceptions.DAOException;

@SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })
@Service("configuracionDAO")
public class ConfiguracionDAOImpl extends GenericDAOImpl<Configuracion> implements ConfiguracionDAO {

	Logger logger = Logger.getLogger(this.getClass());

	@Autowired
	public ConfiguracionDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}

	public Configuracion findByIdConfiguracion(Long codigoConfiguracion) throws DAOException {
		Session session = null;
		List<Configuracion> configuraciones = null;
		Configuracion configuracion = null;
		try {
			session = getHibernateTemplate().getSessionFactory().openSession();
			Criteria crit = session.createCriteria(Configuracion.class);
			crit.add(Expression.eq("id", codigoConfiguracion));
			configuraciones = crit.list();
			if (configuraciones != null && configuraciones.size() > 0) {
				configuracion = configuraciones.get(0);
			}
		} catch (HibernateException e) {
			throw new DAOException(e.getMessage());
		} finally {
			try {
				session.close();
			} catch (HibernateException e) {
				throw new DAOException(e.getMessage());
			}
		}
		return configuracion;
	}

	public List<Configuracion> findConfiguracion() throws DAOException {
		Session session = null;
		List<Configuracion> Configuraciones = null;
		try {
			session = getHibernateTemplate().getSessionFactory().openSession();
			Criteria crit = session.createCriteria(Configuracion.class);
			Configuraciones = crit.list();
		} catch (HibernateException e) {
			throw new DAOException(e.getMessage());
		} finally {
			try {
				session.close();
			} catch (HibernateException e) {
				throw new DAOException(e.getMessage());
			}
		}
		return Configuraciones;
	}

	@Override
	public Configuracion findConfiguracionCargaByCodigoArchivoCarga(String codTipoCargaArchivo) throws DAOException {
		try {
			String hql = "select c from ConfiguracionCarga c, Tabla t "
					+ " where c.tipoArchCarga.id = t.id " + " and t.codigo = '"
					+ codTipoCargaArchivo + "'";
			List<Configuracion> lista = super.executeHqlParam(hql, new ArrayList());
			if (lista != null && lista.size() > 0) {
				return lista.get(0);
			}
		} catch (Exception e) {
			throw new DAOException(e);
		}
		return null;
	}

	public Configuracion findConfiguracionCargaByIdArchivoCarga(String idTipoCargaArchivo) throws DAOException {
		try {
			String hql = "select c from ConfiguracionCarga c, Tabla t "
					+ " where c.tipoArchCarga.id = t.id " + " and t.id = '"
					+ idTipoCargaArchivo + "'";
			List<Configuracion> lista = super.executeHqlParam(hql, new ArrayList());
			if (lista != null && lista.size() > 0) {
				return lista.get(0);
			}
		} catch (Exception e) {
			throw new DAOException(e);
		}
		return null;
	}
}